/**
 * 注意这里是使用这个包“tcb-admin-node”。
 * 那么在“微信的云函数中”，使用的是包“wx-server-sdk”。
 */
const tcb = require('tcb-admin-node')
// 导出自定义登录私钥
const config = require('./config')

// 云函数入口文件
const cloud = require('wx-server-sdk')
cloud.init({
  env: cloud.DYNAMIC_CURRENT_ENV
})

/**
 * 根据用户名密码获取用户信息
 * @param {*} username 
 * @param {*} password
 */
const getUserInfo = async (username, password) => {
  try {
    const {
      data
    } = await cloud.database().collection("users").where({
      username,
      password
    }).get()

    return data[0]
  } catch (error) {
    return {
      msg: "获取用户名密码错误",
      error
    }
  }
}

/**
 * 登录云平台
 */
const loginCloud = async (username, password) => {
  let dataResult = {}

  tcb.init({
    env: 'cake-shop-001-gppbo',
    credentials: {
      private_key_id: config.keyId,
      private_key: config.key
    }
  })

  let temp = null;

  try {
    const userInfo = await getUserInfo(username, password)
    const {
      _id
    } = userInfo

    temp = userInfo

    /**
     * access_token的刷新时间，这个需要在client监听刷新。
     */
    dataResult.ticket = tcb.auth().createTicket(_id, {
      refresh: 10 * 60 * 1000
    })

    return {
      status: 0,
      data: dataResult
    }
  } catch (error) {
    return {
      status: 1,
      msg: {
        username,
        password,
        error: JSON.stringify(error),
        temp
      }
    }
  }
}

/**
 * 登录自定义账户
 */
const loginCustomAccount = async (username, password) => {

  /**
   * 这里必须要这样做，防止和最后return的data中的数据重名，也防止和temp解析出来的数据重名。
   * 其实最好的办法还是传入参数为{}，这样更好改名字。
   */
  const uname = username
  const pwd = password

  try {
    const temp = await getUserInfo(uname, pwd)

    const {
      username,
      password
    } = temp

    // const {
    //   _id
    // } = userInfo

    // return null !== _id ? {
    //   status: 0,
    //   data: {
    //     ...userInfo
    //   }
    // } : {
    //   status: 1,
    //   msg: "用户名或密码不正确"
    // }

    return {
      status: 0,
      data: {
        username,
        password
      }
    }

  } catch (error) {
    return {
      status: 1,
      msg: {
        ...error
      }
    }
  }
}

/**
 * 登录admin页面。
 */
exports.main = async (event, context) => {
  /**
   * 如果是http的post传参，那么使用event.body
   * 如果是一般的callFunction，那么使用event，不需要 JSON.parse()
   */
  const eventData = event.body === undefined ? event : JSON.parse(event.body)

  /**
   * 官网推荐使用axios传递的数据，这里就这样用了，别的地方不是这样获取数据的。
   * flagLoginCloud 表示当前请求是“登录云平台”
   * flagLoginCustomAccount 表示当前请求是“登录自定义账号”
   */
  const {
    flagLoginCloud,
    flagLoginCustomAccount,
    username,
    password
  } = eventData

  let result

  if (flagLoginCloud) {
    result = await loginCloud(username, password)
  } else if (flagLoginCustomAccount) {
    result = await loginCustomAccount(username, password)
  }

  return {
    ...result
  }
}